<?php

namespace Xibeicity\Message\Drivers;

use Xibeicity\Message\Contracts\MessageInterface;
use EasyWeChat\OfficialAccount\Application;

class WechatOfficialAccount implements MessageInterface
{
    protected $app;
    protected $error;

    /**
     * 初始化微信公众号驱动
     *
     * @param array $config 配置信息
     *                      - app_id     微信公众号AppID
     *                      - app_secret 微信公众号AppSecret
     *                      - token      微信公众号Token
     *                      - aes_key    微信公众号消息加解密密钥
     */
    public function __construct(array $config)
    {
        $this->app = new Application([
            'app_id' => $config['app_id'],
            'secret' => $config['app_secret'],
            'token' => $config['token'],
            'aes_key' => $config['aes_key'],
        ]);
    }

    /**
     * 发送微信公众号模板消息
     *
     * @param array  $to      接收者OpenID数组（目前仅支持单个接收者）
     * @param string $content 消息内容（将作为first字段的值）
     * @param array  $options 额外选项
     *                       - template_id 模板ID
     *                       - url        跳转链接
     *                       - data       模板数据
     * 
     * @return array 发送结果
     *               - success    是否发送成功
     *               - message_id 消息ID
     */
    public function send(array $to, string $content, array $options = []): array
    {
        try {
            $message = [
                'touser' => $to[0],
                'template_id' => $options['template_id'] ?? '',
                'url' => $options['url'] ?? '',
                'data' => array_merge(
                    ['first' => ['value' => $content]],
                    $options['data'] ?? []
                )
            ];

            $response = $this->app->template_message->send($message);
            return [
                'success' => $response['errcode'] === 0,
                'message_id' => $response['msgid'] ?? null
            ];
        } catch (\Exception $e) {
            $this->error = $e->getMessage();
            return [
                'success' => false,
                'message_id' => null
            ];
        }
    }

    /**
     * 使用模板发送微信公众号消息
     *
     * @param array  $to            接收者OpenID数组（目前仅支持单个接收者）
     * @param string $templateCode  模板ID
     * @param array  $templateParams 模板参数
     * @param array  $options       额外选项
     *                              - url 跳转链接
     * 
     * @return array 发送结果
     *               - success    是否发送成功
     *               - message_id 消息ID
     */
    public function sendTemplate(array $to, string $templateCode, array $templateParams = [], array $options = []): array
    {
        try {
            $message = [
                'touser' => $to[0],
                'template_id' => $templateCode,
                'url' => $options['url'] ?? '',
                'data' => array_map(function($value) {
                    return ['value' => $value];
                }, $templateParams)
            ];

            $response = $this->app->template_message->send($message);
            return [
                'success' => $response['errcode'] === 0,
                'message_id' => $response['msgid'] ?? null
            ];
        } catch (\Exception $e) {
            $this->error = $e->getMessage();
            return [
                'success' => false,
                'message_id' => null
            ];
        }
    }

    /**
     * 批量发送微信公众号消息
     *
     * @param array $messages 消息列表
     *                       - to      接收者OpenID数组
     *                       - content 消息内容
     *                       - options 额外选项
     * 
     * @return array 每条消息的发送结果数组
     */
    public function batchSend(array $messages): array
    {
        $results = [];
        foreach ($messages as $message) {
            $results[] = $this->send(
                $message['to'],
                $message['content'],
                $message['options'] ?? []
            );
        }
        return $results;
    }

    /**
     * 获取消息发送状态
     *
     * @param string|null $messageId 消息ID
     * 
     * @return array 发送状态
     *               - status 发送状态
     *               - error  错误信息
     */
    public function getStatus(string $messageId = null): array
    {
        return [
            'status' => 'sent',
            'error' => $this->error
        ];
    }

    /**
     * 获取错误信息
     *
     * @return string|null 错误信息
     */
    public function getError(): ?string
    {
        return $this->error;
    }

    /**
     * 获取驱动配置信息
     *
     * @return array 配置信息
     *               - app_id     微信公众号AppID
     *               - app_secret 微信公众号AppSecret
     *               - token      微信公众号Token
     *               - aes_key    微信公众号消息加解密密钥
     */
    public function getConfig(): array
    {
        return [
            'app_id' => $this->app->getConfig()['app_id'],
            'token' => $this->app->getConfig()['token']
        ];
    }
}